Development Models > Imperative Programming Model > Imperative Programming Model for OPC Data (Classic and UA) > Modifying Information (OPC Data) > Writing Attributes of OPC UA Nodes |
If you want to write a data value into an attribute of a specific node in OPC UA, call the WriteValue method, passing it the data value you want to write, arguments for endpoint descriptor, node ID, and an optional data type.
// This example shows how to write a value into a single node. using System; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.OperationModel; namespace UADocExamples._EasyUAClient { partial class WriteValue { public static void Main1() { UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" // Instantiate the client object. var client = new EasyUAClient(); Console.WriteLine("Modifying value of a node..."); try { client.WriteValue(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 12345); } catch (UAException uaException) { Console.WriteLine($"*** Failure: {uaException.GetBaseException().Message}"); return; } Console.WriteLine("Finished."); } } }
# This example shows how to write a value into a single node. #requires -Version 5.1 using namespace OpcLabs.EasyOpc.UA using namespace OpcLabs.EasyOpc.UA.OperationModel # The path below assumes that the current directory is [ProductDir]/Examples-NET/PowerShell/Windows . Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUA.dll" Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUAComponents.dll" [UAEndpointDescriptor]$endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" # or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) # or "https://opcua.demo-this.com:51212/UA/SampleServer/" # Instantiate the client object. $client = New-Object EasyUAClient Write-Host "Modifying value of a node..." try { $client.WriteValue($endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 12345) } catch [UAException] { Write-Host "*** Failure: $($PSItem.Exception.GetBaseException().Message)" return } Write-Host "Finished."
# This example shows how to write a value into a single node. # The QuickOPC package is needed. Install it using "pip install opclabs_quickopc". import opclabs_quickopc # Import .NET namespaces. from OpcLabs.EasyOpc.UA import * from OpcLabs.EasyOpc.UA.OperationModel import * # Instantiate the client object. client = EasyUAClient() # Perform the operation. try: IEasyUAClientExtension.WriteValue(client, UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'), UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10221'), 12345) except UAException as uaException: print('*** Failure: ' + uaException.GetBaseException().Message) exit() print('Finished.')
' This example shows how to write a value into a single node. Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.OperationModel Namespace _EasyUAClient Partial Friend Class WriteValue Public Shared Sub Main1() ' Define which server we will work with. Dim endpointDescriptor As UAEndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) ' or "https://opcua.demo-this.com:51212/UA/SampleServer/" ' Instantiate the client object Dim client = New EasyUAClient() ' Modify value of a node Try client.WriteValue(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 12345) Catch uaException As UAException Console.WriteLine("*** Failure: {0}", uaException.GetBaseException.Message) Exit Sub End Try End Sub End Class End Namespace
// This example shows how to write a value into a single node. #include "stdafx.h" // Includes "QuickOpc.h", and other commonly used files #include "WriteValue.h" namespace _EasyUAClient { void WriteValue::Main() { // Initialize the COM library CoInitializeEx(NULL, COINIT_MULTITHREADED); { // Instantiate the client object _EasyUAClientPtr ClientPtr(__uuidof(EasyUAClient)); // Perform the operation ClientPtr->WriteValue( //L"http://opcua.demo-this.com:51211/UA/SampleServer", L"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", L"nsu=http://test.org/UA/Data/ ;i=10221", 12345); } // Release all interface pointers BEFORE calling CoUninitialize() CoUninitialize(); } }
// This example shows how to write a value into a single node. class procedure WriteValue.Main; var Client: EasyUAClient; begin // Instantiate the client object Client := CoEasyUAClient.Create; // Perform the operation Client.WriteValue( //'http://opcua.demo-this.com:51211/UA/SampleServer', 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer', 'nsu=http://test.org/UA/Data/ ;i=10221', 12345); end;
// This example shows how to write a value into a single node. class procedure WriteValue.Main; var Client: OpcLabs_EasyOpcUA_TLB._EasyUAClient; begin // Instantiate the client object Client := CoEasyUAClient.Create; // Perform the operation try Client.WriteValue( //'http://opcua.demo-this.com:51211/UA/SampleServer', //'https://opcua.demo-this.com:51212/UA/SampleServer/', 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer', 'nsu=http://test.org/UA/Data/ ;i=10221', 12345); except on E: EOleException do begin WriteLn(Format('*** Failure: %s', [E.GetBaseException.Message])); Exit; end; end; end;
// This example shows how to write a value into a single node. // Instantiate the client object $Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient"); // Perform the operation try { $Client->WriteValue( //"http://opcua.demo-this.com:51211/UA/SampleServer", "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", "nsu=http://test.org/UA/Data/ ;i=10221", 12345); } catch (com_exception $e) { printf("*** Failure: %s\n", $e->getMessage()); }
// This example shows how to write a value into a single node. mle_outputtext.Text = "" // Instantiate the client object OLEObject client client = CREATE OLEObject client.ConnectToNewObject("OpcLabs.EasyOpc.UA.EasyUAClient") // Modify value of a node TRY client.WriteValue("http://opcua.demo-this.com:51211/UA/SampleServer", "nsu=http://test.org/UA/Data/ ;i=10221", 12345) CATCH (OLERuntimeError oleRuntimeError) mle_outputtext.Text = mle_outputtext.Text + "*** Failure: " + oleRuntimeError.Description + "~r~n" RETURN END TRY mle_outputtext.Text = mle_outputtext.Text + "~r~n" mle_outputtext.Text = mle_outputtext.Text + "Finished." + "~r~n"
# This example shows how to write a value into a single node. # The Python for Windows (pywin32) extensions package is needed. Install it using "pip install pypiwin32". # CAUTION: We now recommend using Python.NET package instead. Full set of examples with Python.NET is available! import win32com.client from pywintypes import com_error # Instantiate the client object client = win32com.client.Dispatch('OpcLabs.EasyOpc.UA.EasyUAClient') # Perform the operation try: client.WriteValue( 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer', 'nsu=http://test.org/UA/Data/ ;i=10221', 12345) except com_error as e: print('*** Failure: ' + e.args[2][1] + ': ' + e.args[2][2]) exit()
Rem This example shows how to write a value into a single node. Public Sub WriteValue_Main_Command_Click() OutputText = "" ' Instantiate the client object Dim Client As New EasyUAClient ' Perform the operation On Error Resume Next Call Client.WriteValue("opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", "nsu=http://test.org/UA/Data/ ;i=10221", 12345) If Err.Number <> 0 Then OutputText = OutputText & "*** Failure: " & Err.Source & ": " & Err.Description & vbCrLf Exit Sub End If On Error GoTo 0 End Sub
Rem This example shows how to write a value into a single node. Option Explicit ' Instantiate the client object Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient") ' Perform the operation On Error Resume Next Client.WriteValue "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer", "nsu=http://test.org/UA/Data/ ;i=10221", 12345 If Err.Number <> 0 Then WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description WScript.Quit End If On Error Goto 0
// This example shows how to write an ever-incrementing value to an OPC UA variable. using System; using System.Threading; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.AddressSpace; using OpcLabs.EasyOpc.UA.OperationModel; namespace UADocExamples._EasyUAClient { partial class WriteValue { public static void Incrementing() { UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" UANodeId nodeId = "nsu=http://test.org/UA/Data/ ;i=10221"; // Example settings with Softing dataFEED OPC Suite: //UAEndpointDescriptor endpointDescriptor = // "opc.tcp://localhost:4980/Softing_dataFEED_OPC_Suite_Configuration1"; //UANodeId nodeId = "nsu=Local%20Items ;s=Local Items.EAK_Test1.EAK_Testwert1_I4"; // Instantiate the client object var client = new EasyUAClient(); // int i = 0; do { Console.WriteLine($"@{DateTime.Now}: Writing {i}"); try { client.WriteValue(endpointDescriptor, nodeId, i); } catch (UAException uaException) { Console.WriteLine("*** Failure: {0}", uaException.GetBaseException().Message); return; } i = unchecked((i + 1) & 0x7FFFFFFF); Thread.Sleep(2 * 1000); } while (!Console.KeyAvailable); } } }
Rem This example shows how to write an ever-incrementing value to an OPC UA variable. Option Explicit Const endpointDescriptorUrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" Const nodeIdExpandedText = "nsu=http://test.org/UA/Data/ ;i=10221" ' Example settings with Softing dataFEED OPC Suite: 'Const endpointDescriptorUrlString = "opc.tcp://localhost:4980/Softing_dataFEED_OPC_Suite_Configuration1" 'Const nodeIdExpandedText = "nsu=Local%20Items ;s=Local Items.EAK_Test1.EAK_Testwert1_I4" ' Instantiate the client object Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient") ' Dim i: i = 0 Do While True WScript.Echo "@" & Time & ": Writing " & i On Error Resume Next Client.WriteValue endpointDescriptorUrlString, nodeIdExpandedText, i If Err.Number <> 0 Then WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description WScript.Quit End If On Error Goto 0 i = (i + 1) And &H7FFFFFFF WScript.Sleep 2*1000 Loop
When you specify individual arguments to the simplest overload of the WriteValue method, the method will write to the Value attribute of the node, and if the value type is an array, it will modify the whole contents of that array. If you want to write into a different attribute, or write only to a subset of an array, use one of the more complex overloads of the WriteValue method, such as with an argument of UAWriteValueArguments type, and fill this argument will all necessary information.
For writing data values into multiple OPC attributes (in the same or different nodes) in an efficient manner, call the WriteMultipleValues method. You pass in an array of UAWriteValueArgument objects, each specifying the location of OPC node, attribute, and the value to be written.
// This example shows how to write values into 3 nodes at once. using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.OperationModel; namespace UADocExamples._EasyUAClient { partial class WriteMultipleValues { public static void Main1() { UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" // Instantiate the client object var client = new EasyUAClient(); // Modify value of a node client.WriteMultipleValues(new[] { new UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 23456), new UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226", 2.34567890), new UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10227", "ABC") }); // Production code would check the success of the operation. See separate example for that. } } }
# This example shows how to write values into 3 nodes at once. # The QuickOPC package is needed. Install it using "pip install opclabs_quickopc". import opclabs_quickopc # Import .NET namespaces. from OpcLabs.EasyOpc.UA import * from OpcLabs.EasyOpc.UA.OperationModel import * endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer') # or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported) # or 'https://opcua.demo-this.com:51212/UA/SampleServer/' # Instantiate the client object client = EasyUAClient() print('Modifying values of nodes...') writeResultArray = IEasyUAClientExtension.WriteMultipleValues(client, [ UAWriteValueArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10221'), 23456), UAWriteValueArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10226'), 2.34567890), UAWriteValueArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10227'), 'ABC'), ]) # Production code would check the success of the operation. See separate example for that. print() print('Finished.')
' This example shows how to write values into 3 nodes at once. Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.OperationModel Namespace _EasyUAClient Partial Friend Class WriteMultipleValues Public Shared Sub Main1() ' Define which server we will work with. Dim endpointDescriptor As UAEndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) ' or "https://opcua.demo-this.com:51212/UA/SampleServer/" ' Instantiate the client object Dim client = New EasyUAClient() ' Modify value of a node client.WriteMultipleValues(New UAWriteValueArguments() _ { _ New UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 23456), _ New UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226", 2.3456789), _ New UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10227", "ABC") _ } _ ) ' Production code would check the success of the operation. See separate example for that. End Sub End Class End Namespace
The example above can be extended by properly testing for success of each operation, like this:
// This example shows how to write values into 3 nodes at once, test for success of each write and display the exception // message in case of failure. using System; using OpcLabs.BaseLib.OperationModel; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.OperationModel; namespace UADocExamples._EasyUAClient { partial class WriteMultipleValues { public static void TestSuccess() { UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" // Instantiate the client object. var client = new EasyUAClient(); Console.WriteLine("Modifying values of nodes..."); OperationResult[] operationResultArray = client.WriteMultipleValues(new[] { new UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 23456), new UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226", "This string cannot be converted to Double"), new UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;s=UnknownNode", "ABC") }); for (int i = 0; i < operationResultArray.Length; i++) if (operationResultArray[i].Succeeded) Console.WriteLine($"Result {i}: success"); else Console.WriteLine($"Result {i}: {operationResultArray[i].Exception.GetBaseException().Message}"); // Example output: // //Modifying values of nodes... //Result 0: success //Result 1: Input string was not in a correct format. //+ Attempting to change an object of type "System.String" to type "System.Double". //+ The specified original value (string) was "This string cannot be converted to Double". //+ The node descriptor used was: NodeId="nsu=http://test.org/UA/Data/ ;i=10226". //+ The client method called (or event/callback invoked) was 'WriteMultiple[3]'. //Result 2: The status of the OPC-UA attribute data is not Good. The actual status is 'BadNodeIdUnknown'. //+ During writing or method calls, readings may occur when value type is not specified. //+ The node descriptor used was: NodeId="nsu=http://test.org/UA/Data/ ;s=UnknownNode". //+ The client method called (or event/callback invoked) was 'WriteMultiple[3]'. } } }
# This example shows how to write values into 3 nodes at once, test for success of each write and display the exception # message in case of failure. #requires -Version 5.1 using namespace OpcLabs.EasyOpc.UA using namespace OpcLabs.EasyOpc.UA.OperationModel # The path below assumes that the current directory is [ProductDir]/Examples-NET/PowerShell/Windows . Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUA.dll" Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUAComponents.dll" [UAEndpointDescriptor]$endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" # or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) # or "https://opcua.demo-this.com:51212/UA/SampleServer/" # Instantiate the client object. $client = New-Object EasyUAClient Write-Host "Modifying values of nodes..." $operationResultArray = $client.WriteMultipleValues([UAWriteValueArguments[]]@( (New-Object UAWriteValueArguments($endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 23456)), (New-Object UAWriteValueArguments($endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226", "This string cannot be converted to Double")), (New-Object UAWriteValueArguments($endpointDescriptor, "nsu=http://test.org/UA/Data/ ;s=UnknownNode", "ABC")) )) for ($i = 0; $i -lt $operationResultArray.Length; $i++) { if ($operationResultArray[$i].Succeeded) { Write-Host "Result $($i): success" } else { Write-Host "Result $($i): $($operationResultArray[$i].Exception.GetBaseException().Message)" } } # Example output: # #Modifying values of nodes... #Result 0: success #Result 1: Input string was not in a correct format. #+ Attempting to change an object of type "System.String" to type "System.Double". #+ The specified original value (string) was "This string cannot be converted to Double". #+ The node descriptor used was: NodeId="nsu=http://test.org/UA/Data/ ;i=10226". #+ The client method called (or event/callback invoked) was 'WriteMultiple[3]'. #Result 2: The status of the OPC-UA attribute data is not Good. The actual status is 'BadNodeIdUnknown'. #+ During writing or method calls, readings may occur when value type is not specified. #+ The node descriptor used was: NodeId="nsu=http://test.org/UA/Data/ ;s=UnknownNode". #+ The client method called (or event/callback invoked) was 'WriteMultiple[3]'.
# This example shows how to write values into 3 nodes at once, test for success of each write and display the exception # message in case of failure. # The QuickOPC package is needed. Install it using "pip install opclabs_quickopc". import opclabs_quickopc # Import .NET namespaces. from OpcLabs.EasyOpc.UA import * from OpcLabs.EasyOpc.UA.OperationModel import * endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer') # or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported) # or 'https://opcua.demo-this.com:51212/UA/SampleServer/' # Instantiate the client object client = EasyUAClient() print('Modifying values of nodes...') writeResultArray = IEasyUAClientExtension.WriteMultipleValues(client, [ UAWriteValueArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10221'), 23456), UAWriteValueArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10226'), 'This string cannot be converted to Double'), UAWriteValueArguments(endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;s=UnknownNode'), 'ABC'), ]) for i, writeResult in enumerate(writeResultArray): if writeResult.Succeeded: print('writeResultArray[', i, ']: success', sep='') else: print('writeResultArray[', i, '] *** Failure: ', writeResult.Exception.GetBaseException().Message, sep='') print() print('Finished.')
' This example shows how to write values into 3 nodes at once, test for success of each write and display the exception ' message in case of failure. Imports System Imports OpcLabs.BaseLib.OperationModel Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.OperationModel Namespace _EasyUAClient Partial Friend Class WriteMultipleValues Public Shared Sub TestSuccess() ' Define which server we will work with. Dim endpointDescriptor As UAEndpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" ' or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) ' or "https://opcua.demo-this.com:51212/UA/SampleServer/" ' Instantiate the client object Dim client = New EasyUAClient() ' Modify value of a node Dim operationResultArray() As OperationResult = client.WriteMultipleValues(New UAWriteValueArguments() _ { _ New UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10221", 23456), _ New UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10226", "This string cannot be converted to Double"), _ New UAWriteValueArguments(endpointDescriptor, "nsu=http://test.org/UA/Data/ ;s=UnknownNode", "ABC") _ } _ ) For i As Integer = 0 To operationResultArray.Length - 1 If operationResultArray(i).Succeeded Then Console.WriteLine("Result {0}: success", i) Else Console.WriteLine("Result {0}: {1}", i, operationResultArray(i).Exception.GetBaseException().Message) End If Next i End Sub End Class End Namespace
// This example shows how to write values into 3 nodes at once, test for success of each write and display the exception // message in case of failure. #include "stdafx.h" // Includes "QuickOpc.h", and other commonly used files #include <atlsafe.h> #include "WriteMultipleValues.h" namespace _EasyUAClient { void WriteMultipleValues::TestSuccess() { // Initialize the COM library CoInitializeEx(NULL, COINIT_MULTITHREADED); { // Instantiate the client object _EasyUAClientPtr ClientPtr(__uuidof(EasyUAClient)); _UAWriteValueArgumentsPtr WriteValueArguments1Ptr(_uuidof(UAWriteValueArguments)); WriteValueArguments1Ptr->EndpointDescriptor->UrlString = //L"http://opcua.demo-this.com:51211/UA/SampleServer"; L"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; WriteValueArguments1Ptr->NodeDescriptor->NodeId->ExpandedText = L"nsu=http://test.org/UA/Data/ ;i=10221"; WriteValueArguments1Ptr->Value = 23456; _UAWriteValueArgumentsPtr WriteValueArguments2Ptr(_uuidof(UAWriteValueArguments)); WriteValueArguments2Ptr->EndpointDescriptor->UrlString = //L"http://opcua.demo-this.com:51211/UA/SampleServer"; L"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; WriteValueArguments2Ptr->NodeDescriptor->NodeId->ExpandedText = L"nsu=http://test.org/UA/Data/ ;i=10226"; WriteValueArguments2Ptr->Value = L"This string cannot be converted to Double"; _UAWriteValueArgumentsPtr WriteValueArguments3Ptr(_uuidof(UAWriteValueArguments)); WriteValueArguments3Ptr->EndpointDescriptor->UrlString = //L"http://opcua.demo-this.com:51211/UA/SampleServer"; L"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; WriteValueArguments3Ptr->NodeDescriptor->NodeId->ExpandedText = L"nsu=http://test.org/UA/Data/ ;s=UnknownNode"; WriteValueArguments3Ptr->Value = L"ABC"; CComSafeArray<VARIANT> arguments(3); arguments.SetAt(0, _variant_t((IDispatch*)WriteValueArguments1Ptr)); arguments.SetAt(1, _variant_t((IDispatch*)WriteValueArguments2Ptr)); arguments.SetAt(2, _variant_t((IDispatch*)WriteValueArguments3Ptr)); CComVariant vArguments(arguments); // Obtain values. By default, the Value attributes of the nodes will be Write. CComSafeArray<VARIANT> results; results.Attach(ClientPtr->WriteMultipleValues(&vArguments)); // Display results for (int i = results.GetLowerBound(); i <= results.GetUpperBound(); i++) { _UAWriteResultPtr ResultPtr = results[i]; if (ResultPtr->Succeeded) _tprintf(_T("Result %d success\n"), i); else _tprintf(_T("Result d: s\n"), i, (LPCTSTR)CW2CT(ResultPtr->Exception->GetBaseException()->Message)); } } // Release all interface pointers BEFORE calling CoUninitialize() CoUninitialize(); } }
// This example shows how to write values into 3 nodes at once, test for // success of each write and display the exception message in case of failure. class procedure WriteMultipleValues.TestSuccess; var Arguments: OleVariant; Client: EasyUAClient; I: Cardinal; WriteResult: _UAWriteResult; WriteValueArguments1, WriteValueArguments2, WriteValueArguments3: _UAWriteValueArguments; Results: OleVariant; begin WriteValueArguments1 := CoUAWriteValueArguments.Create; WriteValueArguments1.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; WriteValueArguments1.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10221'; WriteValueArguments1.Value := 23456; WriteValueArguments2 := CoUAWriteValueArguments.Create; WriteValueArguments2.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; WriteValueArguments2.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10226'; WriteValueArguments2.Value := 'This string cannot be converted to Double'; WriteValueArguments3 := CoUAWriteValueArguments.Create; WriteValueArguments3.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; WriteValueArguments3.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;s=UnknownNode'; WriteValueArguments3.Value := 'ABC'; Arguments := VarArrayCreate([0, 2], varVariant); Arguments[0] := WriteValueArguments1; Arguments[1] := WriteValueArguments2; Arguments[2] := WriteValueArguments3; // Instantiate the client object Client := CoEasyUAClient.Create; // Modify values of nodes TVarData(Results).VType := varArray or varVariant; TVarData(Results).VArray := PVarArray(Client.WriteMultipleValues( PSafeArray(TVarData(Arguments).VArray))); // Display results for I := VarArrayLowBound(Results, 1) to VarArrayHighBound(Results, 1) do begin WriteResult := IInterface(Results[I]) as _UAWriteResult; if WriteResult.Succeeded then WriteLn('Result ', I, ' success') else WriteLn('Result ', I, ': ', WriteResult.Exception.GetBaseException.Message); end; end;
// This example shows how to write values into 3 nodes at once, test for // success of each write and display the exception message in case of failure. class procedure WriteMultipleValues.TestSuccess; var Arguments: OleVariant; Client: OpcLabs_EasyOpcUA_TLB._EasyUAClient; I: Cardinal; WriteResult: _UAWriteResult; WriteValueArguments1, WriteValueArguments2, WriteValueArguments3: _UAWriteValueArguments; Results: OleVariant; begin WriteValueArguments1 := CoUAWriteValueArguments.Create; WriteValueArguments1.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; WriteValueArguments1.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10221'; WriteValueArguments1.Value := 23456; WriteValueArguments2 := CoUAWriteValueArguments.Create; WriteValueArguments2.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; WriteValueArguments2.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10226'; WriteValueArguments2.Value := 'This string cannot be converted to Double'; WriteValueArguments3 := CoUAWriteValueArguments.Create; WriteValueArguments3.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; WriteValueArguments3.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;s=UnknownNode'; WriteValueArguments3.Value := 'ABC'; Arguments := VarArrayCreate([0, 2], varVariant); Arguments[0] := WriteValueArguments1; Arguments[1] := WriteValueArguments2; Arguments[2] := WriteValueArguments3; // Instantiate the client object Client := CoEasyUAClient.Create; // Modify values of nodes TVarData(Results).VType := varArray or varVariant; TVarData(Results).VArray := PVarArray(Client.WriteMultipleValues(Arguments)); // Display results for I := VarArrayLowBound(Results, 1) to VarArrayHighBound(Results, 1) do begin WriteResult := IInterface(Results[I]) as _UAWriteResult; if WriteResult.Succeeded then WriteLn('Result ', I, ' success') else WriteLn('Result ', I, ': ', WriteResult.Exception.GetBaseException.Message); end; VarClear(Results); VarClear(Arguments); end;
// This example shows how to write values into 3 nodes at once, test for success of each write and display the exception // message in case of failure. // Instantiate the client object $Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient"); $WriteValueArguments1 = new COM("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments"); $WriteValueArguments1->EndpointDescriptor->UrlString = //"http://opcua.demo-this.com:51211/UA/SampleServer"; //"https://opcua.demo-this.com:51212/UA/SampleServer/"; "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; $WriteValueArguments1->NodeDescriptor->NodeId->ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10221"; $WriteValueArguments1->Value = 23456; $WriteValueArguments2 = new COM("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments"); $WriteValueArguments2->EndpointDescriptor->UrlString = //"http://opcua.demo-this.com:51211/UA/SampleServer"; //"https://opcua.demo-this.com:51212/UA/SampleServer/"; "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; $WriteValueArguments2->NodeDescriptor->NodeId->ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10226"; $WriteValueArguments2->Value = "This string cannot be converted to Double"; $WriteValueArguments3 = new COM("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments"); $WriteValueArguments3->EndpointDescriptor->UrlString = //"http://opcua.demo-this.com:51211/UA/SampleServer"; //"https://opcua.demo-this.com:51212/UA/SampleServer/"; "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; $WriteValueArguments3->NodeDescriptor->NodeId->ExpandedText = "nsu=http://test.org/UA/Data/ ;s=UnknownNode"; $WriteValueArguments3->Value = "ABC"; $arguments[0] = $WriteValueArguments1; $arguments[1] = $WriteValueArguments2; $arguments[2] = $WriteValueArguments3; // Modify values of nodes $results = $Client->WriteMultipleValues($arguments); // Display results for ($i = 0; $i < count($results); $i++) { $WriteResult = $results[$i]; // The UA Test Server does not support this, and therefore a failure will occur. if ($WriteResult->Succeeded) printf("Result %d success\n", $i); else printf("Result d: s \n", $i, $WriteResult->Exception->GetBaseException()->Message); }
// This example shows how to write values into 3 nodes at once, test for success of each write and display the exception // message in case of failure. mle_outputtext.Text = "" // Instantiate the client object OLEObject client client = CREATE OLEObject client.ConnectToNewObject("OpcLabs.EasyOpc.UA.EasyUAClient") // Prepare arguments. OLEObject writeValueArguments1 writeValueArguments1 = CREATE OLEObject writeValueArguments1.ConnectToNewObject("OpcLabs.EasyOpc.UA.OperationModel.UAwriteValueArguments") writeValueArguments1.EndpointDescriptor.UrlString = "http://opcua.demo-this.com:51211/UA/SampleServer" writeValueArguments1.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10221" writeValueArguments1.Value = 23456 OLEObject writeValueArguments2 writeValueArguments2 = CREATE OLEObject writeValueArguments2.ConnectToNewObject("OpcLabs.EasyOpc.UA.OperationModel.UAwriteValueArguments") writeValueArguments2.EndpointDescriptor.UrlString = "http://opcua.demo-this.com:51211/UA/SampleServer" writeValueArguments2.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10226" writeValueArguments2.Value = "This string cannot be converted to Double" OLEObject writeValueArguments3 writeValueArguments3 = CREATE OLEObject writeValueArguments3.ConnectToNewObject("OpcLabs.EasyOpc.UA.OperationModel.UAwriteValueArguments") writeValueArguments3.EndpointDescriptor.UrlString = "http://opcua.demo-this.com:51211/UA/SampleServer" writeValueArguments3.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;s=UnknownNode" writeValueArguments3.Value = "ABC" OLEObject writeValueArgumentsList writeValueArgumentsList = CREATE OLEObject writeValueArgumentsList.ConnectToNewObject("OpcLabs.BaseLib.Collections.ElasticVector") writeValueArgumentsList.Add(writeValueArguments1) writeValueArgumentsList.Add(writeValueArguments2) writeValueArgumentsList.Add(writeValueArguments3) // Modify value of nodes OLEObject operationResultList operationResultList = client.WriteValueList(writeValueArgumentsList) // Display results Int i FOR i = 0 TO operationResultList.Count - 1 OLEObject operationResult operationResult = operationResultList.Item[i] IF operationResult.Succeeded THEN mle_outputtext.Text = mle_outputtext.Text + "Result " + String(i) + ": success" + "~r~n" ELSE mle_outputtext.Text = mle_outputtext.Text + "Result " + String(i) + ": " + operationResult.Exception.GetBaseException().Message + "~r~n" END IF NEXT mle_outputtext.Text = mle_outputtext.Text + "~r~n" mle_outputtext.Text = mle_outputtext.Text + "Finished." + "~r~n"
Rem This example shows how to write values into 3 nodes at once, test for success of each write and display the exception Rem message in case of failure. Public Sub WriteMultipleValues_TestSuccess_Command_Click() OutputText = "" ' Instantiate the client object Dim Client As New EasyUAClient Dim WriteValueArguments1 As New UAWriteValueArguments WriteValueArguments1.endpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" WriteValueArguments1.nodeDescriptor.NodeId.expandedText = "nsu=http://test.org/UA/Data/ ;i=10221" WriteValueArguments1.SetValue 23456 Dim WriteValueArguments2 As New UAWriteValueArguments WriteValueArguments2.endpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" WriteValueArguments2.nodeDescriptor.NodeId.expandedText = "nsu=http://test.org/UA/Data/ ;i=10226" WriteValueArguments2.SetValue "This string cannot be converted to Double" Dim WriteValueArguments3 As New UAWriteValueArguments WriteValueArguments3.endpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" WriteValueArguments3.nodeDescriptor.NodeId.expandedText = "nsu=http://test.org/UA/Data/ ;s=UnknownNode" WriteValueArguments3.SetValue "ABC" Dim arguments(2) As Variant Set arguments(0) = WriteValueArguments1 Set arguments(1) = WriteValueArguments2 Set arguments(2) = WriteValueArguments3 ' Modify values of nodes Dim results As Variant results = Client.WriteMultipleValues(arguments) ' Display results Dim i: For i = LBound(results) To UBound(results) Dim Result As UAWriteResult: Set Result = results(i) If Result.Succeeded Then OutputText = OutputText & "Result " & i & " success" & vbCrLf Else OutputText = OutputText & "Result " & i & ": " & Result.Exception.GetBaseException().Message & vbCrLf End If Next End Sub
Rem This example shows how to write values into 3 nodes at once, test for success of each write and display the exception Rem message in case of failure. Option Explicit ' Instantiate the client object Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient") Dim WriteValueArguments1: Set WriteValueArguments1 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments") WriteValueArguments1.EndpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" WriteValueArguments1.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10221" WriteValueArguments1.Value = 23456 Dim WriteValueArguments2: Set WriteValueArguments2 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments") WriteValueArguments2.EndpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" WriteValueArguments2.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;i=10226" WriteValueArguments2.Value = "This string cannot be converted to Double" Dim WriteValueArguments3: Set WriteValueArguments3 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments") WriteValueArguments3.EndpointDescriptor.UrlString = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer" WriteValueArguments3.NodeDescriptor.NodeId.ExpandedText = "nsu=http://test.org/UA/Data/ ;s=UnknownNode" WriteValueArguments3.Value = "ABC" Dim arguments(2) Set arguments(0) = WriteValueArguments1 Set arguments(1) = WriteValueArguments2 Set arguments(2) = WriteValueArguments3 ' Modify values of nodes Dim results: results = Client.WriteMultipleValues(arguments) ' Display results Dim i: For i = LBound(results) To UBound(results) Dim WriteResult: Set WriteResult = results(i) If WriteResult.Succeeded Then WScript.Echo "Result " & i & " success" Else WScript.Echo "Result " & i & ": " & WriteResult.Exception.GetBaseException().Message End If Next
The WriteMultiple and WriteMultipleValues methods return an array of UAWriteResult objects. Besides the inherited members of OperationResult, such as the Exception, the UAWriteResult contains additional information that describes the outcome of the Write operation in case of success:
If you access some node or nodes repeatedly, it might be possible to improve the performance of it by (pre-)registering the node or nodes with the server. The performance improvement will only occur if the target OPC UA server supports the necessary node registration services. For more information, see OPC UA Node Registration Service.
Copyright © 2004-2023 CODE Consulting and Development, s.r.o., Plzen. All rights reserved. Web page: www.opclabs.com
Send Documentation Feedback. Resources: Knowledge Base. Technical support: Online Forums, FAQ.